package tas.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import tas.dao.DaoMantFerNoLabPliego;
import tas.sql.ConectaDb;

public class DaoMantFerNoLabPliegoImpl implements DaoMantFerNoLabPliego {

    private final ConectaDb db;

    public DaoMantFerNoLabPliegoImpl() {
        this.db = new ConectaDb();
    }

    @Override
    public List<Object[]> feriadoNoLabPliegoQry(Integer idestado) {
        List<Object[]> list = null;

        String sql = "SELECT TO_CHAR(FECNOLABPLIEGO.IDFECHA,'DD/MM/YYYY') FECHA "
                + ", FECNOLABPLIEGO.DESCRIPCION DESCRIPCION "
                + ", EST.DESCRIPCIONESTADO ESTADO "
                + ", FECNOLABPLIEGO.IDFECHA "
                + "FROM BDTAS.FERIADONOLABORABLEPLIEGO FECNOLABPLIEGO "
                + "LEFT JOIN BDTAS.ESTADO EST "
                + "ON (EST.IDESTADO=FECNOLABPLIEGO.IDESTADO) "
                + "WHERE FECNOLABPLIEGO.IDESTADO=? "
                + "ORDER BY 4";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idestado);

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[3];

                    f[0] = rs.getObject(1); // FECHA
                    f[1] = rs.getObject(2); // DESCRIPCION
                    f[2] = rs.getObject(3); // ESTADO

                    list.add(f);

                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String feriadoNoLabPliegoIns(String fecha, String descripcion) {
        String result = null;

        String sql0 = "SELECT COUNT(*) "
                + "FROM BDTAS.FERIADONOLABORABLEPLIEGO FERNOLABPLIEGO "
                + "WHERE TO_CHAR(FERNOLABPLIEGO.IDFECHA,'DD/MM/YYYY')=? ";

        String sql = "INSERT INTO BDTAS.FERIADONOLABORABLEPLIEGO "
                + "  (IDFECHA, DESCRIPCION, IDESTADO) "
                + " VALUES(TO_DATE(?, 'DDMMYYYY'),?,?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);
                // select
                PreparedStatement ps = cn.prepareStatement(sql0);
                ps.setString(1, fecha);
                //   ps.setString(2, f[1]);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    int ctos = rs.getInt(1);

                    if (ctos > 0) {
                        throw new SQLException("Feriado No Laborable por pliego ya Existe");
                    }
                }
                rs.close();
                ps.close();
                
                String[] f = fecha.split("/"); // f[0]==dd, f[1]==mm, f[2]==yyyy

                ps = cn.prepareStatement(sql);
                String aux = f[0] + f[1] + f[2];
                ps.setString(1, aux);
                
         
                ps.setString(2, descripcion);
                ps.setInt(3, 1);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("No se pudo registrar Feriado No Laborable Por Pliego");
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String feriadoNoLabPliegoUpd(String fecha, String descripcion) {
        String result = null;
        String sql = "UPDATE BDTAS.FERIADONOLABORABLEPLIEGO "
                + "SET DESCRIPCION=? "
                + " WHERE TO_CHAR(IDFECHA,'DD/MM/YYYY')=? ";
        
        

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {

                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, descripcion);
                ps.setString(2, fecha);

                int ctos = ps.executeUpdate();

                if (ctos == 0) {
                    throw new SQLException("No se pudo actualizar Feriado No Laborable Por Pliego");
                }
                ps.close();

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String feriadoNoLabPliegoEst(String fecha, Integer estado) {
        String result = null;

        estado = ((estado == 1) ? 2 : 1);

        String sql = "UPDATE BDTAS.FERIADONOLABORABLEPLIEGO "
                + "SET IDESTADO=?"
                + "WHERE IDFECHA=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, estado);
                ps.setString(2, fecha);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("No se pudo actualizar Feriado No Laborable Por Pliego");
                }
                ps.close();

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

}
